﻿/*********************************************************************************************************
**
** 创   建   人: CSZQ
**
** 描        述: ASMJIT 使用静态库的例子
**
*********************************************************************************************************/
/*********************************************************************************************************
	头文件
*********************************************************************************************************/
#include <iostream>

#include "../ASMJITLIB/asmjit/asmjit.h"

/*********************************************************************************************************
	前置声明
*********************************************************************************************************/
using namespace asmjit;
/*********************************************************************************************************
	函数
*********************************************************************************************************/
/*********************************************************************************************************
	说明：
		产生汇编
	参数：
		assemblerX86  汇编器
	返回值：
		无
*********************************************************************************************************/
VOID generateShellCode(X86Assembler &assemblerX86) {
	/*
	 * Lable 用于相对跳转,这里是初始化
	 */
	Label lbNext = assemblerX86.newLabel();

	assemblerX86.jmp(lbNext);

	assemblerX86.nop();

	assemblerX86.xor_(x86::rax, x86::rax);
	/*
	 * 此处绑定 Label
	 */
	assemblerX86.bind(lbNext);
	assemblerX86.xor_(x86::rax, x86::rax);
	assemblerX86.xor_(x86::rax, x86::rax);
	assemblerX86.ret();

	assemblerX86.db('a');
	assemblerX86.db('b');
}
/*********************************************************************************************************
	说明：
		Main
	参数：
		无
	返回值：
		无
*********************************************************************************************************/
int main()
{
	std::cout << "Start" << std::endl;

	/*
	 * 基本信息初始化
	 */
	JitRuntime jrt;
	CodeHolder codeBuf;
	codeBuf.init(jrt.getCodeInfo());
	X86Assembler assemblerX86(&codeBuf);

	/*
	 * 代码规则定义
	 */
	generateShellCode(assemblerX86);

	/*
	 * 获取 shellcode 长度
	 */
	UINT32 uLen = assemblerX86.getOffset();
	
	/*
	 * 真正代码生成
	 */
	PVOID pvFunc = 0;
	jrt.add(&pvFunc, &codeBuf);

	std::cout << pvFunc << std::endl;
	std::cout << "Len = " << uLen << std::endl;

	/* 
	 * 方便自动暂停
	 */
	_CrtDbgBreak();

	/* 
	 * 代码分区销毁
	 */
	jrt.release(pvFunc);

	std::cout << "Endl" << std::endl;

	return 0;
}